package com.punch.common.feign.fallback;

import com.punch.common.dto.course.ClassStartDTO;
import com.punch.common.feign.FeignOrderService;
import com.punch.common.vo.order.CourseOrderStudentVO;
import com.punch.common.vo.order.SimpleCourseOrderVO;
import com.punch.common.vo.order.StudentCourseClassVO;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class FeignOrderServiceFallbackFactory implements FallbackFactory<FeignOrderService> {
    @Override
    public FeignOrderService create(Throwable throwable) {
        return new FeignOrderService() {
            /**
             * 开班修改订单状态
             *
             * @param classId 班级id
             * @return 是否成功
             */
            @Override
            public Boolean startClass(Long classId) {
                log.error("课程班级开班异常:{}", classId, throwable);
                return false;
            }

            /**
             * 获取开班课程的报名学生id列表
             *
             * @param classId 班级课程id
             * @return 学生id列表
             */
            @Override
            public List<StudentCourseClassVO> getCourseClassOrderStudent(Long classId) {
                log.error("获取开班课程的报名学生id列表异常:班级id---{}", classId, throwable);
                return new ArrayList<>();
            }

            /**
             * 某学校某年级下的某个班级报名某个课程情况
             *
             * @param schoolName 学校名称
             * @param gradeYear  年级
             * @param gradeClass 班级
             * @param className  报班名称
             * @return
             */
            @Override
            public List<SimpleCourseOrderVO> getSimpleCourseClassOrder(String schoolName, String gradeYear, String gradeClass, String className) {
                log.error("某学校某年级下的某个班级报名某个课程情况异常:schoolName---{},gradeYear---{},gradeClass---{},className---{}", schoolName, gradeYear, gradeClass, className, throwable);
                return new ArrayList<>();
            }

            /**
             * 获取开班课程的报名学生列表
             *
             * @param courseId 课程id
             * @param classId  班级课程id
             * @return 学生id列表
             */
            @Override
            public List<CourseOrderStudentVO> getCourseStudent(Long courseId, Long classId) {
                log.error("获取开班课程的报名学生列表异常::班级id{}--课程id{}", classId, courseId, throwable);
                return new ArrayList<>();
            }

            /**
             * 统计开班课程的报名学生
             *
             * @param classId 班级课程id
             * @return 学生列表
             */
            @Override
            public int getCourseStudentCount(Long courseId, Long classId) {
                log.error("统计开班课程的报名学生异常::班级id{}--课程id{}", classId, courseId, throwable);
                return 0;
            }

            /**
             * 更新该课程下开班的课程订单的已完成课时数
             *
             * @param courseId 课程id
             * @param classId  班级id
             * @return boolean
             */
            @Override
            public Boolean updateClassFinishCount(Long courseId, Long classId) {
                log.error("更新该课程下开班的课程订单的已完成课时数异常:班级id{}--课程id{}", classId, courseId, throwable);
                return false;
            }

            /**
             * 获取学生已报名的订单
             *
             * @param studentId 学生id
             * @return list
             */
            @Override
            public List<Long> getStudentCourseOrderId(Long studentId) {
                log.error("获取学生已报名的订单异常:学生id{}", studentId, throwable);
                return new ArrayList<>();
            }

            /**
             * 学生是否报名该课程
             *
             * @param classId   课程班级id
             * @param studentId 学生id
             * @return boolean
             */
            @Override
            public boolean isSignUp(Long classId, Long studentId) {
                log.error("获取学生是否报名该课程异常:班级id{}--学生id{}", classId, studentId, throwable);
                return false;
            }

            /**
             * 运营修改开班时间
             *
             * @param classId  课程id
             * @param openDate 开班时间
             */
            @Override
            public void feignUpdateCourseOrderOpenDate(Long classId, LocalDate openDate) {
                log.error("运营修改开班时间异常:班级id{}--开班时间{}", classId, openDate, throwable);
            }

            /**
             * 运营修改教师
             *
             * @param classId     课程id
             * @param teacherName 教师名称
             */
            @Override
            public void feignUpdateCourseOrderTeacher(Long classId, String teacherName) {
                log.error("运营修改开班时间异常:班级id{}--教师{}", classId, teacherName, throwable);
            }

            /**
             * 运营修改教室
             *
             * @param classId       课程id
             * @param classRoomName 教师
             */
            @Override
            public void feignUpdateCourseOrderClassRoom(Long classId, String classRoomName) {
                log.error("运营修改开班时间异常:班级id{}--教室{}", classId, classRoomName, throwable);
            }
        };
    }
}
